package com.ys.day28.socket上传下载文件;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 描述: 上传文件服务服务器,提供服务: 把客户端上传的文件写道 服务器磁盘中
 *
 * @author CodeYang
 * @version 2021/1/9 20:04
 */
public class UpLoadServer {

    public static void main(String[] args) {
        try(
                // 注册服务
                ServerSocket se = new ServerSocket(5333);
                // 监听阻塞
                Socket accept = se.accept();
                // 文件读写流
                InputStream is = accept.getInputStream();
                // 装饰为 数据输入流
                DataInputStream dis = new DataInputStream(is);
                // 输出 写到内存中
                ByteArrayOutputStream baos = new ByteArrayOutputStream();

        )
         {
             // 1: 先读取客户端 上传的文件名称,后缀信息
             String suffix = dis.readUTF();
             // 2: 读取客户端上传上来的的文件信息存储到内存流中
             int len = 0;
             byte[] data = new byte[1024];
             while ((len = dis.read(data)) != -1){
                 // 写入内存流
                 baos.write(data,0,len);
             }
             baos.flush();

             // 3 :将内存流写入到磁盘
             // 3-1 拼接路径
             long prefix = System.currentTimeMillis();
             StringBuilder destPath = new StringBuilder();
             destPath.append("day_28/").append(prefix).append(suffix);
             // 3-2 将内存流 写入到磁盘


             FileOutputStream fos = new FileOutputStream(destPath.toString());
             // 装饰流有缓冲区 这里返回msg 是str   --- -- 这里把文件写到 套接字的的 输出流
             BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()) );
             // memory - > bos
             fos.write(baos.toByteArray());
             fos.flush();
             // 写入完成,向客户端响应信息
             bw.write("msg:success");
             bw.newLine();
             bw.flush();


         } catch (Exception e){
            e.printStackTrace();
        }
    }
}
